#pragma once

#include <assert.h>
#include <exception>
#include <string>
#include <vector>

#include "DXGI.h"
#include "D3D11.h"
#include "D3Dcompiler.h"

#define GLARE_THROW(code, message) if (FAILED(code)) throw Exception((string(message) + " at: " + #code).c_str())
#define GLARE_SAFE_RELEASE(instance, message) if (instance != NULL) { GLARE_THROW(instance->Release(), message); instance = NULL; }

namespace Glare {

	typedef std::string string;

	class D3D11GpuBuffer;
	class D3D11GpuResourceFactory;
	class D3D11PixelShader;
	class D3D11ShaderFactory;
	class D3D11VertexShader;

	class D3D11DrawContext;
	class D3D11Driver;

	class D3D11Texture;

	class D3D11RenderTargetInterface;

	class D3D11DrawStateFactory;
	class D3D11SamplerState;

	class D3D11ShaderResourceView;

	class D3D11GpuResourceInterface;
}
